/*
	解法：按行列统计总和 + 前缀模拟切割
	为什么：先将矩阵简化成按行/列的“一维前缀和问题”；
			再在这个基础上做模拟切割；
			从二维问题 → 降维成一维处理，降低复杂度，提高效率。
	时间复杂度：O(n × m)，空间复杂度：O(n + m)
 */
#include <iostream>
#include <vector>
#include <cmath>
#include <climits>

using namespace std;

int main()
{
	int n, m;
	cin >> n >> m;
	
	// 输入土地价值矩阵，同时计算总土地价值
	int totalValue = 0;
	vector<vector<int>> land(n, vector<int>(m, 0));
	
	for(int i = 0; i < n; i++)
	{
		for(int j = 0; j < m; j++)
		{
			cin >> land[i][j];
			totalValue += land[i][j];
		}
	}
	
	// 预处理每一行的总价值
	vector<int> rowSum(n, 0);
	for(int i = 0; i < n; i++)
	{
		for(int j = 0; j < m; j++)
		{
			rowSum[i] += land[i][j];
		}
	}
	
	// 预处理每一列的总价值
	vector<int> colSum(m, 0);
	for(int j = 0; j < m; j++)
	{
		for(int i = 0; i < n; i++)
		{
			colSum[j] += land[i][j];
		}
	}
	
	int minDiff = INT_MAX;
	
	// 横向切割（行分界）
	int upperSum = 0;
	for(int i = 0; i < n - 1; i++)		// 至少保证两边都非空
	{
		upperSum += rowSum[i];
		int lowerSum = totalValue - upperSum;
		minDiff = min(minDiff, abs(upperSum - lowerSum));
	}
	
	// 纵向切割（列分界）
	int leftSum = 0;
	for(int j = 0; j < m - 1; j++)		// 至少保证两边都非空
	{
		leftSum += colSum[j];
		int rightSum = totalValue - leftSum;
		minDiff = min(minDiff, abs(leftSum - rightSum));
	}
	
	cout << minDiff << endl;
	return 0;
}

